inspector: Use gestures/controllers for inspect button
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 26 Jun 2018 12:56:28 +0000 (14:56 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 30 Jul 2018 11:14:12 +0000 (13:14 +0200)
gtk/inspector/inspect-button.c
gtk/inspector/window.h

index ce78c2a8cef862a31ffcb93a1a1b64eaf71715e2..5e58cb1008a8da9e5e2dd100ad745bcf9067c72c 100644 (file)
@@ -33,7 +33,9 @@
 #include "gtkmain.h"
 #include "gtkinvisible.h"
 #include "gtkwidgetprivate.h"
-
+#include "gtkgesturemultipress.h"
+#include "gtkeventcontrollermotion.h"
+#include "gtkeventcontrollerkey.h"
 
 static gboolean
 inspector_contains (GtkWidget *widget,
@@ -247,45 +249,71 @@ reemphasize_window (GtkWidget *window)
     gdk_surface_raise (gtk_widget_get_surface (window));
 }
 
-static gboolean
-property_query_event (GtkWidget *widget,
-                      GdkEvent  *event,
-                      gpointer   data)
+static void
+property_query_pressed (GtkGestureMultiPress *gesture,
+                        guint                 n_press,
+                        gdouble               x,
+                        gdouble               y,
+                        GtkInspectorWindow   *iw)
 {
-  GtkInspectorWindow *iw = (GtkInspectorWindow *)data;
-  GdkEventType event_type = gdk_event_get_event_type (event);
+  GdkEvent *event;
 
-  if (event_type == GDK_BUTTON_RELEASE)
-    {
-      g_signal_handlers_disconnect_by_func (widget, property_query_event, data);
-      gtk_grab_remove (widget);
-      if (iw->grabbed)
-        gdk_seat_ungrab (gdk_event_get_seat (event));
-      reemphasize_window (GTK_WIDGET (iw));
-
-      on_inspect_widget (widget, event, data);
-    }
-  else if (event_type == GDK_MOTION_NOTIFY)
+  gtk_grab_remove (iw->invisible);
+  if (iw->grab_seat)
     {
-      on_highlight_widget (widget, event, data);
+      gdk_seat_ungrab (iw->grab_seat);
+      iw->grab_seat = NULL;
     }
-  else if (event_type == GDK_KEY_PRESS)
-    {
-      guint keyval;
 
-      if (gdk_event_get_keyval (event, &keyval) && keyval == GDK_KEY_Escape)
-        {
-          g_signal_handlers_disconnect_by_func (widget, property_query_event, data);
-          gtk_grab_remove (widget);
-          if (iw->grabbed)
-            gdk_seat_ungrab (gdk_event_get_seat (event));
-          reemphasize_window (GTK_WIDGET (iw));
+  reemphasize_window (GTK_WIDGET (iw));
 
-          clear_flash (iw);
+  event = gtk_get_current_event ();
+  on_inspect_widget (iw->invisible, event, iw);
+  g_object_unref (event);
+
+  gtk_widget_destroy (iw->invisible);
+  iw->invisible = NULL;
+}
+
+static void
+property_query_motion (GtkEventControllerMotion *controller,
+                       gdouble                   x,
+                       gdouble                   y,
+                       GtkInspectorWindow       *iw)
+{
+  GdkEvent *event;
+
+  event = gtk_get_current_event ();
+  on_highlight_widget (iw->invisible, event, iw);
+  g_object_unref (event);
+}
+
+static gboolean
+property_query_key (GtkEventControllerKey *key,
+                    guint                  keyval,
+                    guint                  keycode,
+                    GdkModifierType        modifiers,
+                    GtkInspectorWindow    *iw)
+{
+  if (keyval == GDK_KEY_Escape)
+    {
+      gtk_grab_remove (iw->invisible);
+      if (iw->grab_seat)
+        {
+          gdk_seat_ungrab (iw->grab_seat);
+          iw->grab_seat = NULL;
         }
+      reemphasize_window (GTK_WIDGET (iw));
+
+      clear_flash (iw);
+
+      gtk_widget_destroy (iw->invisible);
+      iw->invisible = NULL;
+
+      return TRUE;
     }
 
-  return TRUE;
+  return FALSE;
 }
 
 static void
@@ -304,6 +332,8 @@ gtk_inspector_on_inspect (GtkWidget          *button,
   GdkDisplay *display;
   GdkCursor *cursor;
   GdkGrabStatus status;
+  GtkEventController *controller;
+  GdkSeat *seat;
 
   if (!iw->invisible)
     {
@@ -314,14 +344,29 @@ gtk_inspector_on_inspect (GtkWidget          *button,
 
   display = gdk_display_get_default ();
   cursor = gdk_cursor_new_from_name ("crosshair", NULL);
-  status = gdk_seat_grab (gdk_display_get_default_seat (display),
+  seat = gdk_display_get_default_seat (display);
+  status = gdk_seat_grab (seat,
                           gtk_widget_get_surface (iw->invisible),
                           GDK_SEAT_CAPABILITY_ALL_POINTING, TRUE,
                           cursor, NULL, prepare_inspect_func, NULL);
   g_object_unref (cursor);
-  iw->grabbed = status == GDK_GRAB_SUCCESS;
-
-  g_signal_connect (iw->invisible, "event", G_CALLBACK (property_query_event), iw);
+  if (status == GDK_GRAB_SUCCESS)
+    iw->grab_seat = seat;
+
+  controller = GTK_EVENT_CONTROLLER (gtk_gesture_multi_press_new ());
+  g_signal_connect (controller, "pressed",
+                   G_CALLBACK (property_query_pressed), iw);
+  gtk_widget_add_controller (iw->invisible, controller);
+
+  controller = GTK_EVENT_CONTROLLER (gtk_event_controller_motion_new ());
+  g_signal_connect (controller, "motion",
+                    G_CALLBACK (property_query_motion), iw);
+  gtk_widget_add_controller (iw->invisible, controller);
+
+  controller = GTK_EVENT_CONTROLLER (gtk_event_controller_key_new ());
+  g_signal_connect (controller, "key-pressed",
+                    G_CALLBACK (property_query_key), iw);
+  gtk_widget_add_controller (iw->invisible, controller);
 
   gtk_grab_add (GTK_WIDGET (iw->invisible));
   deemphasize_window (GTK_WIDGET (iw));
index cc72aeecbf6faf14293df2a9cafd28fe79b00ef1..92e20158674b94a4978d640ded26d5b9d95733da 100644 (file)
@@ -77,7 +77,7 @@ typedef struct
 
   GList *extra_pages;
 
-  gboolean grabbed;
+  GdkSeat *grab_seat;
 
   GtkInspectorOverlay *flash_overlay;
   gint flash_count;